﻿
Перем Токены;
Перем Исходник;
Перем ТаблицаТокенов;
Перем ТаблицаОшибок;

Перем КлючевыеСлова;

Процедура Открыть(Парсер, Параметры) Экспорт

	Токены = Парсер.Токены();
	Исходник = Парсер.Исходник();
	ТаблицаТокенов = Парсер.ТаблицаТокенов();
	ТаблицаОшибок = Парсер.ТаблицаОшибок();

	КлючевыеСлова = Новый Структура;
	КлючевыеСлова.Вставить("Если", "Если");
	КлючевыеСлова.Вставить("If", "If");
	КлючевыеСлова.Вставить("Тогда", "Тогда");
	КлючевыеСлова.Вставить("Then", "Then");
	КлючевыеСлова.Вставить("ИначеЕсли", "ИначеЕсли");
	КлючевыеСлова.Вставить("ElsIf", "ElsIf");
	КлючевыеСлова.Вставить("Иначе", "Иначе");
	КлючевыеСлова.Вставить("Else", "Else");
	КлючевыеСлова.Вставить("КонецЕсли", "КонецЕсли");
	КлючевыеСлова.Вставить("EndIf", "EndIf");
	КлючевыеСлова.Вставить("Для", "Для");
	КлючевыеСлова.Вставить("For", "For");
	КлючевыеСлова.Вставить("Каждого", "Каждого");
	КлючевыеСлова.Вставить("Each", "Each");
	КлючевыеСлова.Вставить("Из", "Из");
	КлючевыеСлова.Вставить("In", "In");
	КлючевыеСлова.Вставить("По", "По");
	КлючевыеСлова.Вставить("To", "To");
	КлючевыеСлова.Вставить("Пока", "Пока");
	КлючевыеСлова.Вставить("While", "While");
	КлючевыеСлова.Вставить("Цикл", "Цикл");
	КлючевыеСлова.Вставить("Do", "Do");
	КлючевыеСлова.Вставить("КонецЦикла", "КонецЦикла");
	КлючевыеСлова.Вставить("EndDo", "EndDo");
	КлючевыеСлова.Вставить("Процедура", "Процедура");
	КлючевыеСлова.Вставить("Procedure", "Procedure");
	КлючевыеСлова.Вставить("КонецПроцедуры", "КонецПроцедуры");
	КлючевыеСлова.Вставить("EndProcedure", "EndProcedure");
	КлючевыеСлова.Вставить("Функция", "Функция");
	КлючевыеСлова.Вставить("Function", "Function");
	КлючевыеСлова.Вставить("КонецФункции", "КонецФункции");
	КлючевыеСлова.Вставить("EndFunction", "EndFunction");
	КлючевыеСлова.Вставить("Перем", "Перем");
	КлючевыеСлова.Вставить("Var", "Var");
	КлючевыеСлова.Вставить("Знач", "Знач");
	КлючевыеСлова.Вставить("Val", "Val");
	КлючевыеСлова.Вставить("Возврат", "Возврат");
	КлючевыеСлова.Вставить("Return", "Return");
	КлючевыеСлова.Вставить("Продолжить", "Продолжить");
	КлючевыеСлова.Вставить("Continue", "Continue");
	КлючевыеСлова.Вставить("Прервать", "Прервать");
	КлючевыеСлова.Вставить("Break", "Break");
	КлючевыеСлова.Вставить("И", "И");
	КлючевыеСлова.Вставить("And", "And");
	КлючевыеСлова.Вставить("Или", "Или");
	КлючевыеСлова.Вставить("Or", "Or");
	КлючевыеСлова.Вставить("Не", "Не");
	КлючевыеСлова.Вставить("Not", "Not");
	КлючевыеСлова.Вставить("ДобавитьОбработчик", "ДобавитьОбработчик");
	КлючевыеСлова.Вставить("AddHandler", "AddHandler");
	КлючевыеСлова.Вставить("УдалитьОбработчик", "УдалитьОбработчик");
	КлючевыеСлова.Вставить("RemoveHandler", "RemoveHandler");
	КлючевыеСлова.Вставить("Попытка", "Попытка");
	КлючевыеСлова.Вставить("Try", "Try");
	КлючевыеСлова.Вставить("Исключение", "Исключение");
	КлючевыеСлова.Вставить("Except", "Except");
	КлючевыеСлова.Вставить("ВызватьИсключение", "ВызватьИсключение");
	КлючевыеСлова.Вставить("Raise", "Raise");
	КлючевыеСлова.Вставить("КонецПопытки", "КонецПопытки");
	КлючевыеСлова.Вставить("EndTry", "EndTry");
	КлючевыеСлова.Вставить("Новый", "Новый");
	КлючевыеСлова.Вставить("New", "New");
	КлючевыеСлова.Вставить("Выполнить", "Выполнить");
	КлючевыеСлова.Вставить("Execute", "Execute");
	КлючевыеСлова.Вставить("Экспорт", "Экспорт");
	КлючевыеСлова.Вставить("Export", "Export");
	КлючевыеСлова.Вставить("Перейти", "Перейти");
	КлючевыеСлова.Вставить("Goto", "Goto");
	КлючевыеСлова.Вставить("Истина", "Истина");
	КлючевыеСлова.Вставить("True", "True");
	КлючевыеСлова.Вставить("Ложь", "Ложь");
	КлючевыеСлова.Вставить("False", "False");
	КлючевыеСлова.Вставить("Неопределено", "Неопределено");
	КлючевыеСлова.Вставить("Undefined", "Undefined");
	КлючевыеСлова.Вставить("Null", "Null");

КонецПроцедуры // Открыть()

Функция Закрыть() Экспорт

	Для ИндексТокена = 0 По ТаблицаТокенов.Количество() - 1 Цикл
		ДанныеТокена = ТаблицаТокенов[ИндексТокена];
		Если КлючевыеСлова.Свойство(ДанныеТокена.Токен) Тогда
			Литерал = Сред(Исходник, ДанныеТокена.Позиция, ДанныеТокена.Длина);
			КлючевоеСлово = Неопределено;
			Если КлючевыеСлова.Свойство(Литерал, КлючевоеСлово) И Литерал <> КлючевоеСлово Тогда
				Ошибка("Неканоничное написание ключевого слова", ДанныеТокена);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	Возврат Неопределено;
КонецФункции // Закрыть()

Функция Подписки() Экспорт
	Перем Подписки;
	Подписки = Новый Массив;
	Возврат Подписки;
КонецФункции // Подписки()

Процедура Ошибка(Текст, Начало, Конец = Неопределено, ЕстьЗамена = Ложь)
	Ошибка = ТаблицаОшибок.Добавить();
	Ошибка.Источник = "ПроверкаКаноничностиКлючевыхСлов";
	Ошибка.Текст = Текст;
	Ошибка.ПозицияНачала = Начало.Позиция;
	Ошибка.НомерСтрокиНачала = Начало.НомерСтроки;
	Ошибка.НомерКолонкиНачала = Начало.НомерКолонки;
	Если Конец = Неопределено Или Конец = Начало Тогда
		Ошибка.ПозицияКонца = Начало.Позиция + Начало.Длина;
		Ошибка.НомерСтрокиКонца = Начало.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Начало.НомерКолонки + Начало.Длина;
	Иначе
		Ошибка.ПозицияКонца = Конец.Позиция + Конец.Длина;
		Ошибка.НомерСтрокиКонца = Конец.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Конец.НомерКолонки + Конец.Длина;
	КонецЕсли;
	Ошибка.ЕстьЗамена = ЕстьЗамена;
КонецПроцедуры